﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaBuscarDuplicados
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PBuscarDuplicados : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.Entrada, value);
            }
        }

        /// <summary>
        /// Salida de datos.
        /// </summary>
        public string Salida
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.Salida);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.Salida, value);
            }
        }

        /// <summary>
        /// Estructura de entrada.
        /// </summary>
        public string EstructuraEntrada
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.EstructuraEntrada);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.EstructuraEntrada, value);
            }
        }

        /// <summary>
        /// Estructura de salida.
        /// </summary>
        public string EstructuraSalida
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.EstructuraSalida);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.EstructuraSalida, value);
            }
        }

        /// <summary>
        /// Fichero con la definición de las funciones de comparación.
        /// </summary>
        public string FuncionesComparacion
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.FuncionesComparacion);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.FuncionesComparacion, value);
            }
        }

        /// <summary>
        /// Fichero con la definición de los patrones de comparación.
        /// </summary>
        public string PatronesComparacion
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.PatronesComparacion);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.PatronesComparacion, value);
            }
        }

        /// <summary>
        /// Listado pares tipos/campos de patrones.
        /// </summary>
        public Dictionary<int, string> DiccionarioTiposPatronesCampos
        {
            get
            {
                return this.getPropiedadDiccionarioIntString(CBuscarDuplicados.CamposTiposPatrones);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.CamposTiposPatrones, value);
            }
        }

        /// <summary>
        /// Campo clave de los datos.
        /// </summary>
        public string CampoOrigenClave
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.CampoOrigenClave);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.CampoOrigenClave, value);
            }
        }

        /// <summary>
        /// Campo destino de los datos.
        /// </summary>
        public string CampoDestinoClave
        {
            get
            {
                return this.getPropiedadString(CBuscarDuplicados.CampoDestinoClave);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.CampoDestinoClave, value);
            }
        }

        /// <summary>
        /// Lista campos que conforman la ventana de datos.
        /// </summary>
        public List<string> ListaCamposVentana
        {
            get
            {
                return this.getPropiedadListaString(CBuscarDuplicados.CamposVentana);
            }
            set
            {
                this.setOrAddPropiedad(CBuscarDuplicados.CamposVentana, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PBuscarDuplicados()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);

            this.Entrada = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaEntrada);
            this.Salida = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaSalida);
            this.EstructuraEntrada = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaEstructuraEntrada);
            this.EstructuraSalida = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaEstructuraSalida);
            this.FuncionesComparacion = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaFuncionesComparacion);
            this.PatronesComparacion = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaPatronesComparacion);
            this.CampoOrigenClave = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaOrigenClave);
            this.CampoDestinoClave = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaDestinoClave);

            // Campos ventana
            int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CBuscarDuplicados.RutaCamposVentana);
            for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
            {
                string campo = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaCamposVentana, indiceCampo);
                this.ListaCamposVentana.Add(campo);
            }

            // Tipos patrones
            int numeroTipos = LeerXml.ObtenerNumeroNodosCampo(xml, CBuscarDuplicados.RutaCamposPatrones);
            for (int indiceTipo = 0; indiceTipo < numeroTipos; indiceTipo++)
            {
                int tipo = -1;
                tipo = int.Parse(LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaCamposPatrones, indiceTipo, "./" + CBuscarDuplicados.NodoPatronesTipoPatron));
                if (tipo >= 0)
                {
                    string campo = LeerXml.ObtenerValorCampo(xml, CBuscarDuplicados.RutaCamposPatrones, indiceTipo, "./" + CBuscarDuplicados.NodoPatronesCampoPatron);
                    if (!string.Empty.Equals(campo))
                        this.DiccionarioTiposPatronesCampos.Add(tipo, campo);
                }
            }
        }
    }
}
